#ifndef MAIN_INTERFACE_H
#define MAIN_INTERFACE_H

#include <QMainWindow>
#include <QSet>
#include <QStandardItemModel>
#include <QItemSelectionModel>
#include <QQueue>
#include <QSqlQuery>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainInterface;
}
QT_END_NAMESPACE

class MainInterface : public QMainWindow
{
    Q_OBJECT

public:
    MainInterface(QWidget *parent = nullptr);
    ~MainInterface();

private:
    Ui::MainInterface *ui;

private:
    //数据模型
    QStandardItemModel* m_tableDataModel;
    //选择模型
    QItemSelectionModel* m_selectionModel;
    //代理模型
    // ReadOnlyDelegate m_readOnlyDelegate;
    //搜索输入框存的值
    QString m_lineEditText;
    //总页数
    int m_pageAmount = 0;
    //现在的页数【改表，更新】
    int m_nowPage = 1;
    //记录条数【每次查询，更新】
    int m_recordAmount = 0;
    //每页多少条数据【固定】
    int m_pageUnit = 50;
    //被修改过的行【查询、修改完后，更新】
    QSet<int> m_alterRows;
    //被删除的行【批量删除前，更新】
    QSet<int> m_deleteRows;
    //被删除的记录id
    QVariantList m_deleteRecordID;
    //记录被修改的数据位置（行值、列值）【修改数据时，更新；批量修改和换标后，清空】
    QHash<int, QList<int>> m_alterPosition;
    //记录表格主键【更新表头行时，更新】
    QVariant m_tablePrimaryKeyField;

    //表名映射到界面
    QHash<QString, QString> m_tableName2UseHash;
    //表字段映射到界面
    QHash<QPair<QString, QString>, QString> m_tableFieldName2UseHash;

    //表名映射
    QHash<QString, QString> m_use2TableNameHash;
    //表字段映射
    QHash<QPair<QString, QString>, QString> m_use2TableFieldNameHash;

    //添加表字段信息（查找和更新时，使用）【更新表头行时，更新】
    QQueue<QString> m_tableFieldQueue;

    //记录修改前的主键【批量修改后，更换表后，清空】
    QHash<int, QVariant> m_primaryKeyValuePreviousHash;

    //主键的列数【更换表后，更新】
    int m_primaryKeyColumnIndex = 0;

private:
    /**
     * @brief 初始化界面样式
     */
    void initializeSetStyleSheet();

    /**
     * @brief 初始化表名映射
     */
    void initializeTableHash();

    /**
     * @brief 初始化表格样式
     */
    void initializeTableViewModel();

    /**
     * @brief 初始化界面
     */
    void  initializeInformationManagePage();

    /**
     * @brief 显示表数据
     * @param query
     */
    void tableInformationTableViewDataShowBySqlQuery(QSqlQuery &query);
    /**
     * @brief 全表显示
     */
    void allTableInformationShow();
    /**
     * @brief 部分表显示
     */
    void partTableInformationShow();

    /**
     * @brief 表头显示
     */
    void tableViewHeadingShow();

    /**
     * @brief 批量修改记录
     */
    void batchAlterRecord();
    /**
     * @brief 批量删除记录
     */
    void batchDeleteRecord();
    /**
     * @brief 刷新表对应的字段
     * @param tableName
     */
    void tableFieldComboxShow(QString tableName);

    /**
     * @brief 判断表中主键是否存在
     * @param primaryKeyField
     * @return
     */
    bool judgePrimaryKeyIsExistence(QString primaryKeyField);
private slots:
    void searchTableData();

};
#endif // MAIN_INTERFACE_H
